importPackage(Packages.de.elo.ix.client);
//@include lib_Class.js
//@include lib_sol.common.IxUtils.js
//@include lib_sol.common.SordUtils.js
//@include lib_sol.common.ix.DynKwlUtils.js
//@include lib_sol.common.ix.FunctionBase.js
var logger = sol.create("sol.Logger", { scope: "sol.contract.ix.functions.CreatePartner" });
/**
* Creates a new company and contact if indicated by the contract metadata.
*
* New elements will only be created, if the map field 'CONTRACT_CREATE_PARTNER' has the value '1' (checkbox activated).
* A new company will be created, if there was no 'PARTNER_NO' found in the contract metadata.
* A new contact will be created, if there was no 'CONTACT_REFERENCE' found in the contract metadata.
*
* @eloix
*
* @requires sol.common.Config
* @requires sol.common.IxUtils
* @requires sol.common.StringUtils
* @requires sol.common.SordUtils
* @requires sol.common.WfUtils
* @requires sol.common.ix.DynKwlUtils
* @requires sol.common.ix.FunctionBase
*
*/
sol.define("sol.contract.ix.functions.CreatePartner", {
extend: "sol.common.ix.FunctionBase",
requiredConfig: ["objId"],
/**
* @cfg {String} objId (required)
*/
/**
* @private
* @property {String} CONTACTLIST_REF_FIELD
* This defines the field, where the contact list reference will be written to.
*/
CONTACTLIST_REF_FIELD: "CONTACTLIST_REFERENCE",
/**
* @private
* @property {Object} MAPPINGS
* This defines the mapping from the contract to the contact fields for the element creation.
*/
MAPPINGS: {
company: [
{ from: { type: "GRP", key: "PARTNER_NAME" }, to: { type: "GRP", key: "COMPANY_NAME" } },
{ from: { type: "MAP", key: "ADDRESS_STREET" }, to: { type: "GRP", key: "ADDRESS_STREET" } },
{ from: { type: "MAP", key: "ADDRESS_ADDITION" }, to: { type: "GRP", key: "ADDRESS_ADDITION" } },
{ from: { type: "MAP", key: "ADDRESS_ZIP_CODE" }, to: { type: "GRP", key: "ADDRESS_ZIP_CODE" } },
{ from: { type: "MAP", key: "ADDRESS_CITY" }, to: { type: "GRP", key: "ADDRESS_CITY" } },
{ from: { type: "MAP", key: "ADDRESS_STATE" }, to: { type: "GRP", key: "ADDRESS_STATE" } },
{ from: { type: "MAP", key: "ADDRESS_COUNTRY" }, to: { type: "GRP", key: "ADDRESS_COUNTRY" } },
{ from: { type: "MAP", key: "CONTRACT_FINANCE_IBAN" }, to: { type: "GRP", key: "FINANCE_IBAN" } },
{ from: { type: "MAP", key: "CONTRACT_FINANCE_BIC" }, to: { type: "GRP", key: "FINANCE_BIC" } },
{ from: { type: "MAP", key: "CONTRACT_FINANCE_VAT_ID_NO" }, to: { type: "GRP", key: "FINANCE_VAT_ID_NO" } },
{ from: { type: "MAP", key: "CONTRACT_FINANCE_TAX_NO" }, to: { type: "GRP", key: "FINANCE_TAX_NO" } },
{ from: { type: "MAP", key: "CONTRACT_FINANCE_REGISTER_NUMBER" }, to: { type: "GRP", key: "FINANCE_REGISTER_NUMBER" } }
],
contact: [
{ from: { type: "GRP", key: "PARTNER_NO" }, to: { type: "GRP", key: "COMPANY_REFERENCE" } },
{ from: { type: "GRP", key: "CONTACT_FIRSTNAME" }, to: { type: "GRP", key: "CONTACT_FIRSTNAME" } },
{ from: { type: "GRP", key: "CONTACT_LASTNAME" }, to: { type: "GRP", key: "CONTACT_LASTNAME" } },
{ from: { type: "MAP", key: "PARTNER_PHONE" }, to: { type: "GRP", key: "CONTACT_TELEPHONE" } },
{ from: { type: "MAP", key: "PARTNER_EMAIL" }, to: { type: "GRP", key: "CONTACT_EMAIL" } },
{ from: { type: "MAP", key: "ADDRESS_STREET" }, to: { type: "GRP", key: "ADDRESS_STREET" } },
{ from: { type: "MAP", key: "ADDRESS_ADDITION" }, to: { type: "GRP", key: "ADDRESS_ADDITION" } },
{ from: { type: "MAP", key: "ADDRESS_ZIP_CODE" }, to: { type: "GRP", key: "ADDRESS_ZIP_CODE" } },
{ from: { type: "MAP", key: "ADDRESS_CITY" }, to: { type: "GRP", key: "ADDRESS_CITY" } },
{ from: { type: "MAP", key: "ADDRESS_STATE" }, to: { type: "GRP", key: "ADDRESS_STATE" } },
{ from: { type: "MAP", key: "ADDRESS_COUNTRY" }, to: { type: "GRP", key: "ADDRESS_COUNTRY" } },
{ from: { type: "GRP", key: "FINANCE_IBAN" }, to: { type: "MAP", key: "CONTRACT_FINANCE_IBAN" } },
{ from: { type: "GRP", key: "FINANCE_BIC" }, to: { type: "MAP", key: "CONTRACT_FINANCE_BIC" } },
{ from: { type: "GRP", key: "FINANCE_VAT_ID_NO" }, to: { type: "MAP", key: "CONTRACT_FINANCE_VAT_ID_NO" } },
{ from: { type: "GRP", key: "FINANCE_TAX_NO" }, to: { type: "MAP", key: "CONTRACT_FINANCE_TAX_NO" } },
{ from: { type: "GRP", key: "FINANCE_REGISTER_NUMBER" }, to: { type: "MAP", key: "CONTRACT_FINANCE_REGISTER_NUMBER" } }
]
},
initialize: function (config) {
var me = this;
me.contractConfig = sol.create("sol.common.Config", { compose: "/contract/Configuration/contract.config" }).config;
me.$super("sol.common.ix.FunctionBase", "initialize", [config]);
me.contactlistReference = me.contractConfig.contactIntegration.defaultContactlistReference;
},
/**
* Creates the contract partner if requested.
*/
process: function () {
var me = this,
sord, clRefCfg, clRefValue, companyResult, contactResult;
if (me.checkAutomaticCreation()) {
sord = ixConnect.ix().checkoutSord(me.objId, SordC.mbAllIndex, LockC.NO);
// if a contact list reference is set, it overrides the default contact list initialized from config
clRefCfg = { type: "MAP", key: me.contractConfig.mapFields.contactlistRef };
if (!me.isEmpty(sord, clRefCfg)) {
clRefValue = sol.common.SordUtils.getValue(sord, clRefCfg);
if (clRefValue) {
me.contactlistReference = String(clRefValue);
}
}
if (me.checkCreateCompany(sord)) {
companyResult = sol.common.IxUtils.execute("RF_sol_contact_service_CreateCompany", {
companyType: "Default", // TODO -> from config (node or json?)
data: me.buildData(sord, me.MAPPINGS.company)
});
me.logger.info("created new company", companyResult);
me.updatePartnerNo(sord, companyResult);
}
if (me.checkCreateContact(sord)) {
contactResult = sol.common.IxUtils.execute("RF_sol_contact_service_CreateContact", {
contactType: "Default", // TODO -> from config (node or json?)
data: me.buildData(sord, me.MAPPINGS.contact)
});
me.logger.info("created new contact", contactResult);
me.updateContactRef(sord, contactResult);
}
ixConnect.ix().checkinSord(sord, SordC.mbAllIndex, LockC.NO);
}
},
/**
* @private
* Checks, if automatic cretion is activated
* @return {Boolean}
*/
checkAutomaticCreation: function () {
var me = this,
passed = false,
fieldName, mapitems;
fieldName = me.contractConfig.mapFields.createPartnerContact;
mapitems = ixConnect.ix().checkoutMap(MapDomainC.DOMAIN_SORD, me.objId, [fieldName], LockC.NO).items;
if (mapitems && (mapitems.length === 1)) {
passed = (String(mapitems[0].value) === "1"); // checkbox checked
}
return passed;
},
/**
* @private
* Checks, if a new company should be created.
*
* If no company reference is defined (i.e. was not selected from the list) and a name was provided a new one will be created.
* @param {de.elo.ix.client.Sord} sord
* @return {Boolean}
*/
checkCreateCompany: function (sord) {
var me = this;
return me.isEmpty(sord, { type: "GRP", key: me.contractConfig.fields.partnerNo })
&& !me.isEmpty(sord, { type: "GRP", key: me.contractConfig.fields.partnerName });
},
/**
* @private
* Checks, if a new contact should be created.
*
* If no contact reference is defined (i.e. was not selected from the list) as well as a first and lastname are provided a new one will be created.
* @param {de.elo.ix.client.Sord} sord
* @return {Boolean}
*/
checkCreateContact: function (sord) {
var me = this;
return me.isEmpty(sord, { type: "MAP", key: me.contractConfig.mapFields.contactRef })
&& !me.isEmpty(sord, { type: "GRP", key: me.contractConfig.fields.contactFirstName })
&& !me.isEmpty(sord, { type: "GRP", key: me.contractConfig.fields.contactLastName });
},
/**
* @private
* Checks, if a field contains a value.
* @param {de.elo.ix.client.Sord} sord
* @param {Object} fieldCfg
* @return {Boolean}
*/
isEmpty: function (sord, fieldCfg) {
var passed = true,
value;
if (sord && fieldCfg) {
value = sol.common.SordUtils.getValue(sord, fieldCfg);
passed = sol.common.StringUtils.isBlank(value);
}
return passed;
},
/**
* @private
* Creates the data for the RF_sol_contact_service_CreateCompany function.
* @param {de.elo.ix.client.Sord} sord
* @param {Object[]} mappings
* @return {Object[]}
*/
buildData: function (sord, mappings) {
var me = this,
data = [];
data.push({ type: "GRP", key: me.CONTACTLIST_REF_FIELD, value: me.contactlistReference });
mappings.forEach(function (mapping) {
var value;
value = sol.common.SordUtils.getValue(sord, mapping.from);
if (value) {
mapping.to.value = String(value);
data.push(mapping.to);
}
});
return data;
},
/**
* @private
* Updates the sord with the partner reference value
* @param {de.elo.ix.client.Sord} sord
* @param {Object} createResult
*/
updatePartnerNo: function (sord, createResult) {
var me = this;
if (createResult.reference) {
sol.common.SordUtils.setObjKeyValue(sord, me.contractConfig.fields.partnerNo, createResult.reference);
}
},
/**
* @private
* Updates the sord with the partner reference value
* @param {de.elo.ix.client.Sord} sord
* @param {Object} createResult
*/
updateContactRef: function (sord, createResult) {
var me = this,
mapitem;
if (createResult.reference) {
mapitem = new KeyValue(me.contractConfig.mapFields.contactRef, createResult.reference);
ixConnect.ix().checkinMap(MapDomainC.DOMAIN_SORD, sord.id, sord.id, [mapitem], LockC.NO);
}
}
});
/**
* @member sol.contract.ix.functions.CreatePartner
* @static
* @inheritdoc sol.common.ix.FunctionBase#onEnterNode
*/
function onEnterNode(clInfo, userId, wFDiagram, nodeId) {
logger.enter("onEnterNode_CreatePartner", { flowId: wFDiagram.id, nodeId: nodeId });
var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId),
module;
params.objId = wFDiagram.objId;
module = sol.create("sol.contract.ix.functions.CreatePartner", params);
module.process();
logger.exit("onEnterNode_CreatePartner");
}
/**
* @member sol.contract.ix.functions.CreatePartner
* @static
* @inheritdoc sol.common.ix.FunctionBase#onExitNode
*/
function onExitNode(clInfo, userId, wFDiagram, nodeId) {
logger.enter("onExitNode_CreatePartner", { flowId: wFDiagram.id, nodeId: nodeId });
var params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId),
module;
params.objId = wFDiagram.objId;
module = sol.create("sol.contract.ix.functions.CreatePartner", params);
module.process();
logger.exit("onExitNode_CreatePartner");
}